#pragma once
#include <iostream>
#include <vector>
#include <list>

#include "stack.h"
#include "queue.h"
#include "priority_queue.h"

void test1()
{
	MyQueue::Queue<int> qu;

	qu.push(0);
	qu.push(1);
	qu.push(2);
	qu.push(3);
	qu.push(4);
	qu.push(5);
	std::cout << qu.front() << ' ' << qu.size() << ' ' << qu.empty() << std::endl;
	qu.pop();
	std::cout << qu.front() << ' ' << qu.size() << ' ' << qu.empty() << std::endl;
	qu.pop();
	std::cout << qu.front() << ' ' << qu.size() << ' ' << qu.empty() << std::endl;
	qu.pop();
	std::cout << qu.front() << ' ' << qu.size() << ' ' << qu.empty() << std::endl;
	qu.pop();
	std::cout << qu.front() << ' ' << qu.size() << ' ' << qu.empty() << std::endl;
	qu.pop();
	std::cout << qu.front() << ' ' << qu.size() << ' ' << qu.empty() << std::endl;
	qu.pop();
	std::cout <<  qu.size() << ' ' << qu.empty() << std::endl;
	
}
void test2()
{
	MyStack::Stack<int> st;

	st.push(0);
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	st.push(5);
	std::cout << st.top() << ' ' << st.size() << ' ' << st.empty() << std::endl;
	st.pop();
	std::cout << st.top() << ' ' << st.size() << ' ' << st.empty() << std::endl;
	st.pop();
	std::cout << st.top() << ' ' << st.size() << ' ' << st.empty() << std::endl;
	st.pop();
	std::cout << st.top() << ' ' << st.size() << ' ' << st.empty() << std::endl;
	st.pop();
	std::cout << st.top() << ' ' << st.size() << ' ' << st.empty() << std::endl;
	st.pop();
	std::cout << st.top() << ' ' << st.size() << ' ' << st.empty() << std::endl;
	st.pop();
	std::cout << st.size() << ' ' << st.empty() << std::endl;
}

void test3()
{
	MyPirorityQueue::Pirority_Queue<int, std::vector<int>, MyPirorityQueue::Greater<int >> pq;

	pq.push(1);
	pq.print();

	pq.push(3);
	pq.print();

	pq.push(5);
	pq.print();

	pq.push(11);
	pq.print();

	pq.push(13);
	pq.print();

	pq.push(15);
	pq.print();

	pq.push(2);
	pq.print();

	pq.push(4);
	pq.print();

	pq.push(6);
	pq.print();

	pq.push(12);
	pq.print();

	pq.push(14);
	pq.print();

	pq.push(16);
	pq.print();

	/*int a = pq.top();
	std::cout << a << std::endl;

	pq.pop();
	a = pq.top();
	std::cout << a << std::endl;

	std::cout << pq.size() << " " << pq.empty() << std::endl;*/

	pq.print();
	pq.pop();
	
	pq.print();
	pq.pop();
	
	pq.print();
	pq.pop();

	pq.print();
	pq.pop();

	pq.print();
	pq.pop();

	pq.print();
	pq.pop();

	pq.print();
	pq.pop();
}

int main()
{
	/*test2();
	test1();*/
	test3();
	return 0;
}
